package com.myapp.mail;

import com.myapp.bean.Enseignant;
import com.myapp.bean.Etudiant;
import com.myapp.bean.MaitreDeStage;
import java.util.Date;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

/**
 *
 * @author Astrid
 */
public class EnvoyerMail {
    // Chaîne de caractère répétitives
    public static final String EXPEDITEUR = "lhillah@u-paris10.fr";
    public static final String SERVEURSMTP = "smtp.u-paris10.com";
    public static final String MAILSMTPHOST = "mail.smtp.host";
    public static final String OBJETMAIL = "Notification";
    public static final String DEBUTMESSAGE ="ci-dessous les différents renseignements concernant cette notification \n";
    public static final String FINMESSAGE = "\n\n Cordialement,\n Le secrétariat de la MIAGE";
    /**
     * Permet d'envoyer un mail à la liste d'étudiant envoyée en paramètre
     *
     * @param listEtu
     * @param typeNotif
     */
    private void envoyerMailEtudiant(Set listEtu, String typeNotif, String dateNotif, String heureNotif) {
        Set<Etudiant> listEtudiants = (HashSet) listEtu;
        for (Etudiant e : listEtudiants) {
            // expediteur --> "Admin Recrut'Miage <miage@u-paris10.fr>"
            String expediteur = EXPEDITEUR;
            // serveurSMTP --> "smtp.u-paris10.fr"
            String serveurSMTP = SERVEURSMTP;
            Properties props = new Properties();
            props.put(MAILSMTPHOST, serveurSMTP);

            Session mailSession = Session.getDefaultInstance(props, null);
            try {
                Message msg = new MimeMessage(mailSession);
                msg.setFrom(new InternetAddress(expediteur));
                InternetAddress address = new InternetAddress(e.getMail());
                msg.setRecipient(Message.RecipientType.TO, address);
                msg.setSubject(OBJETMAIL);
                msg.setSentDate(new Date());
                msg.setText("Bonjour" + e.getPrenom() + e.getNom() +", \n Voici "
                        + DEBUTMESSAGE
                        + "Type de la notification : " + typeNotif
                        + "\nDate de la notification : " + dateNotif
                        + "\nHeure de la notification : " + heureNotif
                        + FINMESSAGE);
                Transport.send(msg);
            } catch (MessagingException mex) {
                mex.getMessage();
            }
        }
    }

    /**
     * Permet d'envoyer un mail à une liste d'enseignant passée en paramètre
     *
     * @param listEns
     * @param typeNotif
     */
    private void envoyerMailEnseignant(Set listEns, String typeNotif, String dateNotif, String heureNotif) {
        Set<Enseignant> listEnseignants = (HashSet) listEns;
        for (Enseignant e : listEnseignants) {
            // expediteur --> "Admin Recrut'Miage <miage@u-paris10.fr>"
            String expediteur = EXPEDITEUR;
            // serveurSMTP --> "smtp.u-paris10.fr"
            String serveurSMTP = SERVEURSMTP;
            Properties props = new Properties();
            props.put(MAILSMTPHOST, serveurSMTP);

            Session mailSession = Session.getDefaultInstance(props, null);
            try {
                Message msg = new MimeMessage(mailSession);
                msg.setFrom(new InternetAddress(expediteur));
                InternetAddress address = new InternetAddress(e.getEmail());
                msg.setRecipient(Message.RecipientType.TO, address);
                msg.setSubject(OBJETMAIL);
                msg.setSentDate(new Date());
                msg.setText("Bonjour" + e.getPrenom() + e.getNom() +", \n Voici"
                        + DEBUTMESSAGE
                        + "Type de la notification : " + typeNotif
                        + "\nDate de la notification : " + dateNotif
                        + "\nHeure de la notification : " + heureNotif
                        + FINMESSAGE);
                Transport.send(msg);
            } catch (MessagingException mex) {
                mex.getMessage();
            }
        
        }
    }

    /**
     * Permet d'envoyer un mail à une liste de maître de stage passée en
     * paramètre
     *
     * @param listeMDS
     * @param typeNotif
     */
    private void envoyerMailMaitreDeStage(Set listeMDS, String typeNotif, String dateNotif, String heureNotif) {
        Set<MaitreDeStage> listeMaitreStage = (HashSet) listeMDS;
        for (MaitreDeStage m : listeMaitreStage) {
            // expediteur --> "Admin Recrut'Miage <miage@u-paris10.fr>"
            String expediteur = EXPEDITEUR;
            // serveurSMTP --> "smtp.u-paris10.fr"
            String serveurSMTP = SERVEURSMTP;
            Properties props = new Properties();
            props.put(MAILSMTPHOST, serveurSMTP);

            Session mailSession = Session.getDefaultInstance(props, null);
            try {
                Message msg = new MimeMessage(mailSession);
                msg.setFrom(new InternetAddress(expediteur));
                InternetAddress address = new InternetAddress(m.getEmail());
                msg.setRecipient(Message.RecipientType.TO, address);
                msg.setSubject(OBJETMAIL);
                msg.setSentDate(new Date());
                msg.setText("Bonjour" + m.getPrenom() + m.getNom() +", \n Voici"
                        + DEBUTMESSAGE
                        + "Type de la notification : " + typeNotif
                        + "\nDate de la notification : " + dateNotif
                        + "\nHeure de la notification : " + heureNotif
                        + FINMESSAGE);
                Transport.send(msg);
            } catch (MessagingException mex) {
                mex.getMessage();
            }
        
        }
    }

    public void notifier(Set listEtu, Set listEns, Set listMDS, String typeNotif, String dateNotif, String heureNotif) {

        // On a 3 cas différents :
        //          -- Cas 1 : listEns = null   & listEtu != null & listMDS != null
        //          -- Cas 2 : listMDS = null   & listEtu != null & listEns != null 
        //          -- Cas 3 : listEns != null & listMDS != null   & listEtu != null
        if (listEns == null && listEtu != null && listMDS != null) {
            envoyerMailEtudiant(listEtu, typeNotif, dateNotif, heureNotif);
            envoyerMailMaitreDeStage(listMDS, typeNotif, dateNotif, heureNotif);
        } else {
            if (listEns != null && listEtu != null && listMDS == null) {
                envoyerMailEtudiant(listEtu, typeNotif, dateNotif, heureNotif);
                envoyerMailEnseignant(listEns, typeNotif, dateNotif, heureNotif);
            } else {
                if (listEns != null && listEtu != null && listMDS != null) {
                    envoyerMailEtudiant(listEtu, typeNotif, dateNotif, heureNotif);
                    envoyerMailEnseignant(listEns, typeNotif, dateNotif, heureNotif);
                    envoyerMailMaitreDeStage(listMDS, typeNotif, dateNotif, heureNotif);
                }
            }
        }
    }
}
